package com.tidy.seed.util;

import java.util.Collection;
import java.util.Map;
import java.util.Objects;

/**
 * 全面的对象工具类，封装常用的对象判断、转换和处理方法
 */
public final class ObjUtils {

    // 私有构造方法，防止实例化
    private ObjUtils() {
        throw new AssertionError("工具类不允许实例化");
    }

    // ========================= 基础对象判断 =========================

    /**
     * 判断对象是否为null
     *
     * @param obj 待判断对象
     * @return true：为null；false：非null
     */
    public static boolean isNull(Object obj) {
        return obj == null;
    }

    /**
     * 判断对象是否非null
     *
     * @param obj 待判断对象
     * @return true：非null；false：为null
     */
    public static boolean isNotNull(Object obj) {
        return !isNull(obj);
    }

    /**
     * 判断两个对象是否相等（处理null情况）
     *
     * @param a 第一个对象
     * @param b 第二个对象
     * @return true：相等（包括都为null）；false：不相等
     */
    public static boolean equals(Object a, Object b) {
        return Objects.equals(a, b);
    }

    // ========================= 字符串判断 =========================

    /**
     * 判断字符串是否为null或空字符串
     *
     * @param str 待判断字符串
     * @return true：为null或空字符串；false：非空
     */
    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

    /**
     * 判断字符串是否非null且非空字符串
     *
     * @param str 待判断字符串
     * @return true：非空；false：为null或空字符串
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    /**
     * 判断字符串是否为null、空字符串或纯空格
     *
     * @param str 待判断字符串
     * @return true：为null、空或纯空格；false：有效字符串
     */
    public static boolean isBlank(String str) {
        if (isEmpty(str)) {
            return true;
        }
        // 检查是否全是空白字符
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断字符串是否非null、非空且非纯空格
     *
     * @param str 待判断字符串
     * @return true：有效字符串；false：为null、空或纯空格
     */
    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    // ========================= 集合判断 =========================

    /**
     * 判断集合是否为null或空集合
     *
     * @param collection 待判断集合
     * @return true：为null或空集合；false：非空集合
     */
    public static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * 判断集合是否非null且非空集合
     *
     * @param collection 待判断集合
     * @return true：非空集合；false：为null或空集合
     */
    public static boolean isNotEmpty(Collection<?> collection) {
        return !isEmpty(collection);
    }

    // ========================= 数组判断 =========================

    /**
     * 判断数组是否为null或空数组
     *
     * @param array 待判断数组
     * @return true：为null或空数组；false：非空数组
     */
    public static boolean isEmpty(Object[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 判断数组是否非null且非空数组
     *
     * @param array 待判断数组
     * @return true：非空数组；false：为null或空数组
     */
    public static boolean isNotEmpty(Object[] array) {
        return !isEmpty(array);
    }

    /**
     * 判断int数组是否为null或空数组
     */
    public static boolean isEmpty(int[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 判断long数组是否为null或空数组
     */
    public static boolean isEmpty(long[] array) {
        return array == null || array.length == 0;
    }

    // ========================= Map判断 =========================

    /**
     * 判断Map是否为null或空Map
     *
     * @param map 待判断Map
     * @return true：为null或空Map；false：非空Map
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return map == null || map.isEmpty();
    }

    /**
     * 判断Map是否非null且非空Map
     *
     * @param map 待判断Map
     * @return true：非空Map；false：为null或空Map
     */
    public static boolean isNotEmpty(Map<?, ?> map) {
        return !isEmpty(map);
    }

    // ========================= 数值判断 =========================

    /**
     * 判断数字是否为正数（大于0）
     *
     * @param number 待判断数字（支持Integer、Long、Double等）
     * @return true：正数；false：非正数或null
     */
    public static boolean isPositive(Number number) {
        return isNotNull(number) && number.doubleValue() > 0;
    }

    /**
     * 判断数字是否为非负数（大于等于0）
     *
     * @param number 待判断数字
     * @return true：非负数；false：负数或null
     */
    public static boolean isNonNegative(Number number) {
        return isNotNull(number) && number.doubleValue() >= 0;
    }

    // ========================= 空值处理 =========================

    /**
     * 如果对象为null，返回默认值
     *
     * @param obj          原始对象
     * @param defaultValue 默认值
     * @return 非null的对象（原始对象或默认值）
     */
    public static <T> T defaultIfNull(T obj, T defaultValue) {
        return isNull(obj) ? defaultValue : obj;
    }

    /**
     * 获取对象的哈希码（null对象返回0）
     *
     * @param obj 待计算哈希码的对象
     * @return 哈希码
     */
    public static int hashCode(Object obj) {
        return isNull(obj) ? 0 : obj.hashCode();
    }
}
